#include"common.h"
#include"ConcurrentAlloc.h"
#include"ObjectPool.h"
#include"BenchMark.h"
// void Alloc1(){
//     for(int i=0;i<5;i++){
//        void* ptr= ConcurrentAlloc(6);
//        (void)ptr; 
//        std::this_thread::sleep_for(std::chrono::seconds(1)); // 休息 1 秒
//     }
// }
// void Alloc2(){
//     for(int i=0;i<5;i++){
//        void* ptr= ConcurrentAlloc(130);
//        (void)ptr; 
//        std::this_thread::sleep_for(std::chrono::seconds(1)); // 休息 1 秒
//     }
// }
// void TLSTest(){
//     std::thread t1(Alloc1);
//     t1.join();
//     std::thread t2(Alloc2);
//     t2.join();
// }
// void TestAddreeShift(){
//    PageID iD=2000;
//    PageID ID2=2001;
//    void* ptr=(void*)(iD<<PAGE_SHIFT);
//     cout<<"ptr="<<ptr<<endl;
//     void* ptr2=(void*)(ID2<<PAGE_SHIFT);
//     while(ptr<ptr2){
//         cout<<(void*)ptr<<":"<<((PageID)ptr>>PAGE_SHIFT)<<endl;
//         ptr+=8;
//     }
// }
// void TestConcurrentAlloc(){
//     for(int i=0;i<5;i++){
//         void*p1=ConcurrentAlloc(6);
//         std::cout<<p1<<std::endl;
//     }
//     void*p2=ConcurrentAlloc(8);
//     std::cout<<p2<<std::endl;
// }
void Test(){
    void *p1=ConcurrentAlloc(6);
    void *p2=ConcurrentAlloc(8);
    void *p3=ConcurrentAlloc(1);
    void *p4=ConcurrentAlloc(7);
    void *p5=ConcurrentAlloc(8);
    cout<<"p1="<<p1<<endl;
    cout<<"p2="<<p2<<endl;
    cout<<"p3="<<p3<<endl;
    cout<<"p4="<<p4<<endl;
    cout<<"p5="<<p5<<endl;
    ConcurrentFree(p1);
    ConcurrentFree(p2);
    ConcurrentFree(p3);
    ConcurrentFree(p4);
    ConcurrentFree(p5);

}
// void ObjectPoolTest(){
//     // ObjectPool<TreeNode> pool;
//     // TreeNode* n1 = pool.New();
//     // TreeNode* n2 = pool.New();
//     // std::cout<<n1<<std::endl;
//     // std::cout<<n2<<std::endl;
// }
void BigAlloc(){
    void* p=ConcurrentAlloc(257*1024);
    cout<<"p="<<p<<endl;
    ConcurrentFree(p);
    void *p2=ConcurrentAlloc(1025*1024);
    ConcurrentFree(p2);
    cout<<"p2="<<p2<<endl;
}
// int main(){
//     //Test();
//     // TestAddreeShift();
//     //TestConcurrentAlloc();
//     //Test();
//     //ObjectPoolTest();
//     //BigAlloc();
//     Test();
//     return 0;
// }
int main()
{
    const size_t n = 100000;
    cout << "==========================================================\n";
    BenchmarkConcurrentMalloc(n, 4, 10);
    BenchmarkMalloc(n, 4, 10);
    cout << "==========================================================\n";
    return 0;
}